在 JavaScript 中,for-in
循环和 for-of
循环是用于遍历集合的两种不同方式,但它们有不同的用途和行为。以下是它们的主要区别:
for-in
循环
遍历对象属性:
for-in
循环用于遍历对象的可枚举属性(包括原型链上的属性,除非使用hasOwnProperty
方法进行过滤)。- 它不仅适用于数组,还适用于对象、Map 和 Set(但通常不用于遍历 Map 和 Set,因为
for-of
更适合)。
属性顺序:
- 遍历属性的顺序不保证是插入顺序,特别是在 ES2015 及更高版本中,属性的遍历顺序可能会受到一些因素的影响(如数字键的排序)。
语法:
const obj = { a: 1, b: 2, c: 3 }; for (const key in obj) { if (obj.hasOwnProperty(key)) { console.log(key, obj[key]); } }
枚举性:
for-in
循环只遍历对象的可枚举属性,不可枚举属性(如通过Object.defineProperty
定义的属性,且enumerable
设置为false
)不会被遍历。
for-of
循环
遍历可迭代对象:
for-of
循环用于遍历可迭代对象(如数组、字符串、Map、Set、TypedArray、NodeList 等)。- 它直接遍历对象的值,而不是键。
顺序:
- 遍历顺序是插入顺序,对于数组和字符串,它按索引顺序遍历。
语法:
const arr = [1, 2, 3]; for (const value of arr) { console.log(value); } const str = 'hello'; for (const char of str) { console.log(char); } const map = new Map([['a', 1], ['b', 2]]); for (const [key, value] of map) { console.log(key, value); }
不遍历对象属性:
for-of
循环不能用于普通对象,因为普通对象不是可迭代对象。如果尝试对普通对象使用for-of
,会抛出错误。
总结
- 使用
for-in
循环遍历对象的可枚举属性(包括原型链上的属性,需要hasOwnProperty
过滤)。 - 使用
for-of
循环遍历可迭代对象的值(如数组、字符串、Map、Set 等)。
选择哪种循环取决于你要遍历的数据类型以及你的具体需求。
原文出处:
内容源于AI仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/318.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。